<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="generator" content="ApiGen 2.6.0" />
	<meta name="robots" content="noindex" />

	<title>File __lib.php</title>

	<script type="text/javascript" src="resources/combined.js?428767200"></script>
	<script type="text/javascript" src="elementlist.js?4200546020"></script>
	<link rel="stylesheet" type="text/css" media="all" href="resources/style.css?2495970611" />

</head>

<body>
<div id="left">
	<div id="menu">
		<a href="index.html" title="Overview"><span>Overview</span></a>


		<div id="groups">
			<h3>Namespaces</h3>
			<ul>
				<li class="active"><a href="namespace-None.html">None</a>
						</li>
				<li><a href="namespace-PHP.html">PHP</a>
						</li>
			</ul>
		</div>

		<hr />


		<div id="elements">
			<h3>Classes</h3>
			<ul>
				<li><a href="class-DIBase.html">DIBase</a></li>
				<li><a href="class-DIConfig.html">DIConfig</a></li>
				<li><a href="class-DIContext.html">DIContext</a></li>
				<li><a href="class-DIContext_Inject.html">DIContext_Inject</a></li>
				<li><a href="class-DIDBConfig.html" class="invalid">DIDBConfig</a></li>
				<li><a href="class-DIDo.html">DIDo</a></li>
				<li><a href="class-DIEntity.html">DIEntity</a></li>
				<li><a href="class-DIError.html">DIError</a></li>
				<li><a href="class-DIErrorCode.html">DIErrorCode</a></li>
				<li><a href="class-DIEvent.html">DIEvent</a></li>
				<li><a href="class-DIFilterMap.html">DIFilterMap</a></li>
				<li><a href="class-DIFilterUtil.html">DIFilterUtil</a></li>
				<li><a href="class-DIInclude.html">DIInclude</a></li>
				<li><a href="class-DIIncludeConfig.html">DIIncludeConfig</a></li>
				<li><a href="class-DIInject.html">DIInject</a></li>
				<li><a href="class-DILet.html">DILet</a></li>
				<li><a href="class-DIModel.html">DIModel</a></li>
				<li><a href="class-DIModelUtil.html">DIModelUtil</a></li>
				<li><a href="class-DIMySQL.html">DIMySQL</a></li>
				<li><a href="class-DIRoute.html">DIRoute</a></li>
				<li><a href="class-DIRuntime.html">DIRuntime</a></li>
				<li><a href="class-DIRuntime_Imported.html">DIRuntime_Imported</a></li>
				<li><a href="class-DIService.html">DIService</a></li>
				<li><a href="class-DITpl.html">DITpl</a></li>
				<li><a href="class-DIUrlShell.html">DIUrlShell</a></li>
				<li><a href="class-Global1Filter.html">Global1Filter</a></li>
				<li><a href="class-Global2Filter.html">Global2Filter</a></li>
				<li><a href="class-Global3Filter.html">Global3Filter</a></li>
				<li><a href="class-OrekiUtil.html">OrekiUtil</a></li>
				<li><a href="class-TemplateDo.html">TemplateDo</a></li>
				<li><a href="class-Test.html">Test</a></li>
				<li><a href="class-TestDo.html">TestDo</a></li>
				<li><a href="class-TestInject.html">TestInject</a></li>
				<li><a href="class-TesttestDo.html">TesttestDo</a></li>
				<li><a href="class-XxxFilter.html">XxxFilter</a></li>
				<li><a href="class-YyyFilter.html">YyyFilter</a></li>
			</ul>

			<h3>Interfaces</h3>
			<ul>
				<li><a href="class-DIEvent_AppendFuncListener.html">DIEvent_AppendFuncListener</a></li>
				<li><a href="class-DIEvent_AppendVariableListener.html">DIEvent_AppendVariableListener</a></li>
				<li><a href="class-DIEvent_CallFuncListener.html">DIEvent_CallFuncListener</a></li>
				<li><a href="class-DIEvent_CallStaticFuncListener.html">DIEvent_CallStaticFuncListener</a></li>
				<li><a href="class-DIEvent_ClassCallListener.html">DIEvent_ClassCallListener</a></li>
				<li><a href="class-DIEvent_DestroyListener.html">DIEvent_DestroyListener</a></li>
				<li><a href="class-DIEvent_GetStaticVariableListener.html">DIEvent_GetStaticVariableListener</a></li>
				<li><a href="class-DIEvent_GetVariableListener.html">DIEvent_GetVariableListener</a></li>
				<li><a href="class-DIEvent_ObjCallListener.html">DIEvent_ObjCallListener</a></li>
				<li><a href="class-DIEvent_ObjCreateListener.html">DIEvent_ObjCreateListener</a></li>
				<li><a href="class-DIEvent_SetStaticVariableListener.html">DIEvent_SetStaticVariableListener</a></li>
				<li><a href="class-DIEvent_SetVariableListener.html">DIEvent_SetVariableListener</a></li>
				<li><a href="class-DIEventListener.html">DIEventListener</a></li>
				<li><a href="class-DIFilter.html">DIFilter</a></li>
				<li><a href="class-DIModelTemplate.html">DIModelTemplate</a></li>
			</ul>


			<h3>Exceptions</h3>
			<ul>
				<li><a href="class-DIException.html">DIException</a></li>
			</ul>


			<h3>Functions</h3>
			<ul>
				<li><a href="function-__autoload.html">__autoload</a></li>
				<li><a href="function-arg.html">arg</a></li>
				<li class="active"><a href="function-array_unset.html">array_unset</a></li>
				<li><a href="function-bt_page.html">bt_page</a></li>
				<li><a href="function-bt_shell_page.html">bt_shell_page</a></li>
				<li><a href="function-component_exist.html">component_exist</a></li>
				<li><a href="function-create_class.html">create_class</a></li>
				<li><a href="function-dump.html">dump</a></li>
				<li><a href="function-getip.html">getip</a></li>
				<li><a href="function-import.html">import</a></li>
				<li><a href="function-inject.html">inject</a></li>
				<li><a href="function-inject_dymic.html">inject_dymic</a></li>
				<li><a href="function-inject_full.html">inject_full</a></li>
				<li><a href="function-inject_func.html">inject_func</a></li>
				<li><a href="function-injectObjFunc.html">injectObjFunc</a></li>
				<li><a href="function-invoke_func.html">invoke_func</a></li>
				<li><a href="function-invoke_method.html">invoke_method</a></li>
				<li><a href="function-let.html">let</a></li>
				<li><a href="function-let_exists.html">let_exists</a></li>
				<li><a href="function-params_to_str.html">params_to_str</a></li>
				<li><a href="function-putjson.html">putjson</a></li>
				<li><a href="function-putjsonp.html">putjsonp</a></li>
				<li><a href="function-redirect.html">redirect</a></li>
				<li><a href="function-ref_arr.html">ref_arr</a></li>
				<li><a href="function-session.html">session</a></li>
				<li><a href="function-session_exists.html">session_exists</a></li>
				<li><a href="function-session_remove.html">session_remove</a></li>
				<li><a href="function-url.html">url</a></li>
			</ul>
		</div>
	</div>
</div>

<div id="splitter"></div>

<div id="right">
<div id="rightInner">
	<form id="search">
		<input type="hidden" name="cx" value="" />
		<input type="hidden" name="ie" value="UTF-8" />
		<input type="text" name="q" class="text" />
		<input type="submit" value="Search" />
	</form>

	<div id="navigation">
		<ul>
			<li>
				<a href="index.html" title="Overview"><span>Overview</span></a>
			</li>
			<li>
				<a href="namespace-None.html" title="Summary of None"><span>Namespace</span></a>
			</li>
			<li>
				<a href="function-array_unset.html" title="Summary of array_unset"><span>Function</span></a>
			</li>
		</ul>
		<ul>
			<li>
				<a href="tree.html" title="Tree view of classes, interfaces, traits and exceptions"><span>Tree</span></a>
			</li>
		</ul>
		<ul>
		</ul>
	</div>

<pre><code><a href="#1" id="1" class="l">  1: </a><span class="xlang">&lt;?php</span>
<a href="#2" id="2" class="l">  2: </a><span class="php-comment">/**
</span><a href="#3" id="3" class="l">  3: </a><span class="php-comment"> * 这里放置系统内置函数，内置实用类
</span><a href="#4" id="4" class="l">  4: </a><span class="php-comment"> * 按照顺序env-&gt;lib-&gt;event-&gt;base-&gt;config-&gt;entity-&gt;model-&gt;filter-&gt;action-&gt;service-&gt;tpl-&gt;route-&gt;init， 
</span><a href="#5" id="5" class="l">  5: </a><span class="php-comment"> * 除了env和include，所有函数体中不能使用func之后定义或生成的常量、变量、类、函数。
</span><a href="#6" id="6" class="l">  6: </a><span class="php-comment"> */</span>
<a href="#7" id="7" class="l">  7: </a>
<a href="#8" id="8" class="l">  8: </a>
<a href="#9" id="9" class="l">  9: </a><span class="php-comment">/* 目录包含算法 */</span>
<a href="#10" id="10" class="l"> 10: </a><span class="php-keyword1">class</span> DIInclude {
<a href="#11" id="11" class="l"> 11: </a>    <span class="php-comment">/**
</span><a href="#12" id="12" class="l"> 12: </a><span class="php-comment">     * TODO: 包含目录内所有层次子目录的*.php文件
</span><a href="#13" id="13" class="l"> 13: </a><span class="php-comment">     */</span>
<a href="#14" id="14" class="l"> 14: </a>    <span class="php-keyword1">public</span> <span class="php-keyword1">static</span> <span class="php-keyword1">function</span> includeAllPHP( <span class="php-var">$dir</span> ){
<a href="#15" id="15" class="l"> 15: </a>        <span class="php-keyword1">foreach</span> (<span class="php-keyword2">explode</span>(<span class="php-quote">'|'</span>, <span class="php-var">$dir</span>) <span class="php-keyword1">as</span> <span class="php-var">$path</span>){
<a href="#16" id="16" class="l"> 16: </a>            <span class="php-keyword1">if</span>( <span class="php-keyword2">in_array</span>(<span class="php-var">$path</span>, <span class="php-keyword1">array</span>(<span class="php-quote">''</span>,<span class="php-quote">'./'</span>,<span class="php-quote">'../'</span>)) || <span class="php-keyword1">false</span> !== <span class="php-keyword2">strpos</span>(<span class="php-var">$path</span>, <span class="php-quote">'./'</span>))
<a href="#17" id="17" class="l"> 17: </a>                <span class="php-keyword1">continue</span>;
<a href="#18" id="18" class="l"> 18: </a>            <span class="php-var">$path</span> = <span class="php-keyword2">trim</span>(<span class="php-keyword2">trim</span>(<span class="php-var">$path</span>),<span class="php-quote">'/'</span>);
<a href="#19" id="19" class="l"> 19: </a>            <span class="php-var">$path</span> .= <span class="php-quote">'/'</span>;
<a href="#20" id="20" class="l"> 20: </a>            self::parsePhpDirFromLibDirAndAutoIncludeTheir( <span class="php-var">$path</span> );
<a href="#21" id="21" class="l"> 21: </a>        }
<a href="#22" id="22" class="l"> 22: </a>    }
<a href="#23" id="23" class="l"> 23: </a>    <span class="php-comment">/**
</span><a href="#24" id="24" class="l"> 24: </a><span class="php-comment">     * TODO: 自动检测某层目录内指定格式的文件，并包含之。
</span><a href="#25" id="25" class="l"> 25: </a><span class="php-comment">     * 例如：Xxx.action.php，Xxx.filter.php, Xxx.entity.php
</span><a href="#26" id="26" class="l"> 26: </a><span class="php-comment">     * @param string $xxxFormatDir 目录路径，要求以“/”结尾。例如：APPROOT.'core/entity/'
</span><a href="#27" id="27" class="l"> 27: </a><span class="php-comment">     * @param string $secondExtname 显现特性的第二扩展名，例如：“AbcObject.obj.php”中的“obj”。
</span><a href="#28" id="28" class="l"> 28: </a><span class="php-comment">     * @param string $suffix 显现特性的后缀，例如“AbcObject”中的“Object”。一般不推荐用这个参数，原因在于不简洁。
</span><a href="#29" id="29" class="l"> 29: </a><span class="php-comment">     */</span>
<a href="#30" id="30" class="l"> 30: </a>    <span class="php-keyword1">public</span> <span class="php-keyword1">static</span> <span class="php-keyword1">function</span> parseXxxFormatFromDirAndAutoIncludeTheir( <span class="php-var">$xxxFormatDir</span>, <span class="php-var">$secondExtname</span>, <span class="php-var">$suffix</span>=<span class="php-keyword1">null</span>){
<a href="#31" id="31" class="l"> 31: </a>        <span class="php-keyword1">foreach</span> (<span class="php-keyword2">glob</span>(APPROOT.<span class="php-var">$xxxFormatDir</span>.<span class="php-quote">'{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z}*'</span> . <span class="php-var">$suffix</span> . <span class="php-quote">'.'</span> . <span class="php-var">$secondExtname</span> . <span class="php-quote">'.php'</span>, GLOB_BRACE) <span class="php-keyword1">as</span> <span class="php-var">$xxxFormatDirFile</span>){
<a href="#32" id="32" class="l"> 32: </a>            <span class="php-keyword1">require</span> <span class="php-var">$xxxFormatDirFile</span>;
<a href="#33" id="33" class="l"> 33: </a>        }
<a href="#34" id="34" class="l"> 34: </a>    }
<a href="#35" id="35" class="l"> 35: </a>
<a href="#36" id="36" class="l"> 36: </a>    <span class="php-comment">/*
</span><a href="#37" id="37" class="l"> 37: </a><span class="php-comment">     * 自动检测开发者在  指定的  目录自行添加的库文件或目录（或者其它php常量配置文件），并包含其内任何层次目录的[*.php]。
</span><a href="#38" id="38" class="l"> 38: </a><span class="php-comment">    * 参数要求：格式如：$path = APPROOT.'core/lib/'
</span><a href="#39" id="39" class="l"> 39: </a><span class="php-comment">    *           必须从项目根目录开始指定
</span><a href="#40" id="40" class="l"> 40: </a><span class="php-comment">    *           不能以“/”开头
</span><a href="#41" id="41" class="l"> 41: </a><span class="php-comment">    *           要以“/”结尾
</span><a href="#42" id="42" class="l"> 42: </a><span class="php-comment">    * 参数$layer是层次，以输入路径为第0层，每递归一次便自增，用于测试，可以查看递归了多少次。
</span><a href="#43" id="43" class="l"> 43: </a><span class="php-comment">    */</span>
<a href="#44" id="44" class="l"> 44: </a>    <span class="php-keyword1">private</span> <span class="php-keyword1">static</span> <span class="php-keyword1">function</span> parsePhpDirFromLibDirAndAutoIncludeTheir(<span class="php-var">$path</span>, <span class="php-var">$layer</span>=<span class="php-num">0</span>){
<a href="#45" id="45" class="l"> 45: </a>        <span class="php-comment">//echo &quot;=====进入第($layer)层=====&lt;br&gt;&quot;;</span>
<a href="#46" id="46" class="l"> 46: </a>        <span class="php-keyword1">if</span>( <span class="php-keyword2">is_dir</span>(<span class="php-var">$path</span>) &amp;&amp; (<span class="php-var">$dh</span>=<span class="php-keyword2">opendir</span>(<span class="php-var">$path</span>)) ) {
<a href="#47" id="47" class="l"> 47: </a>            <span class="php-keyword1">while</span>(<span class="php-keyword1">false</span> !== (<span class="php-var">$file</span>=<span class="php-keyword2">readdir</span>(<span class="php-var">$dh</span>))){
<a href="#48" id="48" class="l"> 48: </a>                <span class="php-keyword1">if</span>(<span class="php-keyword2">in_array</span>(<span class="php-var">$file</span>, <span class="php-keyword1">array</span>(<span class="php-quote">'.'</span>,<span class="php-quote">'..'</span>)))
<a href="#49" id="49" class="l"> 49: </a>                    <span class="php-keyword1">continue</span>;
<a href="#50" id="50" class="l"> 50: </a>                <span class="php-keyword1">if</span>(<span class="php-keyword2">is_dir</span>(<span class="php-var">$path</span>.<span class="php-var">$file</span>)){
<a href="#51" id="51" class="l"> 51: </a>                    <span class="php-comment">//echo &quot;第($layer)层：目录 - &quot;.$path.$file.&quot;/&lt;br&gt;&quot;;</span>
<a href="#52" id="52" class="l"> 52: </a>                    self::parsePhpDirFromLibDirAndAutoIncludeTheir(<span class="php-var">$path</span>.<span class="php-var">$file</span>.<span class="php-quote">'/'</span>, <span class="php-var">$layer</span>+<span class="php-num">1</span>);
<a href="#53" id="53" class="l"> 53: </a>                }<span class="php-keyword1">else</span>{
<a href="#54" id="54" class="l"> 54: </a>                    <span class="php-comment">//echo &quot;第($layer)层：文件 - &quot;.$path.$file.&quot;&lt;br&gt;&quot;;</span>
<a href="#55" id="55" class="l"> 55: </a>                    <span class="php-keyword1">if</span>(<span class="php-num">0</span>!==<span class="php-keyword2">preg_match</span>(<span class="php-quote">'/\.php$/'</span>, <span class="php-var">$file</span>))
<a href="#56" id="56" class="l"> 56: </a>                        <span class="php-keyword1">require</span> <span class="php-var">$path</span>.<span class="php-var">$file</span>;
<a href="#57" id="57" class="l"> 57: </a>                }
<a href="#58" id="58" class="l"> 58: </a>            }
<a href="#59" id="59" class="l"> 59: </a>            <span class="php-keyword2">closedir</span>(<span class="php-var">$dh</span>);
<a href="#60" id="60" class="l"> 60: </a>            <span class="php-comment">//echo &quot;=====跳出第($layer)层=====&lt;br&gt;&quot;;</span>
<a href="#61" id="61" class="l"> 61: </a>        }
<a href="#62" id="62" class="l"> 62: </a>    }
<a href="#63" id="63" class="l"> 63: </a>}
<a href="#64" id="64" class="l"> 64: </a>
<a href="#65" id="65" class="l"> 65: </a>
<a href="#66" id="66" class="l"> 66: </a><span class="php-comment">/**
</span><a href="#67" id="67" class="l"> 67: </a><span class="php-comment"> * 自动加载保留目录的文件，详见DIIncludeConfig::DI_SPCL_AUTOLOAD_PATH() || DI_NOSPCL_AUTOLOAD_PATH() @ __include.php
</span><a href="#68" id="68" class="l"> 68: </a><span class="php-comment"> * 如果保留目录里没有符合要求的文件，则加载ext目录中的扩展文件。
</span><a href="#69" id="69" class="l"> 69: </a><span class="php-comment"> * 如果启用了严格模式，且最终没有找到系统组件的支持文件，则会抛出DIExceptoin异常。
</span><a href="#70" id="70" class="l"> 70: </a><span class="php-comment"> */</span>
<a href="#71" id="71" class="l"> 71: </a><span class="php-comment">/* 旧版：仅支持自动加载有特定后缀的文件以及ext目录文件
</span><a href="#72" id="72" class="l"> 72: </a><span class="php-comment">function __autoload( $class_name ){
</span><a href="#73" id="73" class="l"> 73: </a><span class="php-comment">    $aap = DIIncludeConfig::DI_SPCL_AUTOLOAD_PATH();
</span><a href="#74" id="74" class="l"> 74: </a><span class="php-comment">    $pos = false;
</span><a href="#75" id="75" class="l"> 75: </a><span class="php-comment">    $path = '';
</span><a href="#76" id="76" class="l"> 76: </a><span class="php-comment">
</span><a href="#77" id="77" class="l"> 77: </a><span class="php-comment">    foreach ($aap as $i=&gt;$p){
</span><a href="#78" id="78" class="l"> 78: </a><span class="php-comment">        $pos = strripos($class_name, $i);
</span><a href="#79" id="79" class="l"> 79: </a><span class="php-comment">        if(false!==$pos){
</span><a href="#80" id="80" class="l"> 80: </a><span class="php-comment">            $path = $p;
</span><a href="#81" id="81" class="l"> 81: </a><span class="php-comment">            break;
</span><a href="#82" id="82" class="l"> 82: </a><span class="php-comment">        }
</span><a href="#83" id="83" class="l"> 83: </a><span class="php-comment">    }
</span><a href="#84" id="84" class="l"> 84: </a><span class="php-comment">
</span><a href="#85" id="85" class="l"> 85: </a><span class="php-comment">    if(false!==$pos){
</span><a href="#86" id="86" class="l"> 86: </a><span class="php-comment">        $name = substr($class_name, 0, $pos);
</span><a href="#87" id="87" class="l"> 87: </a><span class="php-comment">        $path = str_replace('{name}', $name, $path);
</span><a href="#88" id="88" class="l"> 88: </a><span class="php-comment">        if(file_exists($path)){
</span><a href="#89" id="89" class="l"> 89: </a><span class="php-comment">            require $path;//包含保留目录中的所需的文件
</span><a href="#90" id="90" class="l"> 90: </a><span class="php-comment">        }
</span><a href="#91" id="91" class="l"> 91: </a><span class="php-comment">    }else{
</span><a href="#92" id="92" class="l"> 92: </a><span class="php-comment">        DIInclude::includeAllPHP( DI_EXT_PATH );//包含ext目录中所有文件（其实这么处理会有一定风险，因为在ext目录可能存在同名的类，且类中存在与欲访问的方法同名的方法，这样就导致了ext目录中某类方法的逻辑覆盖了预想的逻辑）
</span><a href="#93" id="93" class="l"> 93: </a><span class="php-comment">    }
</span><a href="#94" id="94" class="l"> 94: </a><span class="php-comment">
</span><a href="#95" id="95" class="l"> 95: </a><span class="php-comment">    //如果ext目录中所有文件也没定义该类，则定义一个这样的类防止报Fatal Error的错误
</span><a href="#96" id="96" class="l"> 96: </a><span class="php-comment">    if(! class_exists($class_name, false) ){
</span><a href="#97" id="97" class="l"> 97: </a><span class="php-comment">        eval(&quot;class $class_name {}&quot;);
</span><a href="#98" id="98" class="l"> 98: </a><span class="php-comment">    }
</span><a href="#99" id="99" class="l"> 99: </a><span class="php-comment">} */</span>
<a href="#100" id="100" class="l">100: </a><span class="php-keyword1">function</span> __autoload( <span class="php-var">$class_name</span> ){
<a href="#101" id="101" class="l">101: </a>    <span class="php-var">$aap</span> = DIIncludeConfig::DI_SPCL_AUTOLOAD_PATH();
<a href="#102" id="102" class="l">102: </a>    <span class="php-var">$pos</span> = <span class="php-keyword1">false</span>;
<a href="#103" id="103" class="l">103: </a>    <span class="php-var">$name</span> = <span class="php-quote">''</span>; <span class="php-var">$path</span> = <span class="php-quote">''</span>;
<a href="#104" id="104" class="l">104: </a>
<a href="#105" id="105" class="l">105: </a>    <span class="php-keyword1">foreach</span> (<span class="php-var">$aap</span> <span class="php-keyword1">as</span> <span class="php-var">$i</span>=&gt;<span class="php-var">$p</span>){
<a href="#106" id="106" class="l">106: </a>        <span class="php-var">$pos</span> = <span class="php-keyword2">strripos</span>(<span class="php-var">$class_name</span>, <span class="php-var">$i</span>);
<a href="#107" id="107" class="l">107: </a>        <span class="php-keyword1">if</span>(<span class="php-keyword1">false</span>!==<span class="php-var">$pos</span>){
<a href="#108" id="108" class="l">108: </a>            <span class="php-var">$name</span> = <span class="php-keyword2">substr</span>(<span class="php-var">$class_name</span>, <span class="php-num">0</span>, <span class="php-var">$pos</span>);
<a href="#109" id="109" class="l">109: </a>            <span class="php-var">$path</span> = <span class="php-keyword2">str_replace</span>(<span class="php-quote">'{name}'</span>, <span class="php-var">$name</span>, <span class="php-var">$p</span>);
<a href="#110" id="110" class="l">110: </a>            <span class="php-keyword2">file_exists</span>(<span class="php-var">$path</span>) &amp;&amp; <span class="php-keyword1">require</span> <span class="php-var">$path</span>;
<a href="#111" id="111" class="l">111: </a>            <span class="php-keyword1">break</span>;
<a href="#112" id="112" class="l">112: </a>        }
<a href="#113" id="113" class="l">113: </a>    }
<a href="#114" id="114" class="l">114: </a>    
<a href="#115" id="115" class="l">115: </a>    <span class="php-keyword1">if</span>(<span class="php-keyword1">false</span>===<span class="php-var">$pos</span>){
<a href="#116" id="116" class="l">116: </a>        <span class="php-var">$aap</span> = DIIncludeConfig::DI_NOSPCL_AUTOLOAD_PATH();
<a href="#117" id="117" class="l">117: </a>        <span class="php-var">$name</span> = &amp;<span class="php-var">$class_name</span>;
<a href="#118" id="118" class="l">118: </a>        <span class="php-keyword1">foreach</span> (<span class="php-var">$aap</span> <span class="php-keyword1">as</span> <span class="php-var">$i</span>=&gt;<span class="php-var">$p</span>){
<a href="#119" id="119" class="l">119: </a>            <span class="php-var">$path</span> = <span class="php-keyword2">str_replace</span>(<span class="php-quote">'{name}'</span>, <span class="php-var">$name</span>, <span class="php-var">$p</span>);
<a href="#120" id="120" class="l">120: </a>            <span class="php-keyword1">if</span>(<span class="php-keyword2">file_exists</span>(<span class="php-var">$path</span>)){
<a href="#121" id="121" class="l">121: </a>                <span class="php-keyword1">require</span> <span class="php-var">$path</span>;
<a href="#122" id="122" class="l">122: </a>                <span class="php-comment">//return;</span>
<a href="#123" id="123" class="l">123: </a>                <span class="php-comment">//goto INCLUDE_EXT;</span>
<a href="#124" id="124" class="l">124: </a>                <span class="php-keyword1">break</span>;
<a href="#125" id="125" class="l">125: </a>            }
<a href="#126" id="126" class="l">126: </a>        }
<a href="#127" id="127" class="l">127: </a>    }
<a href="#128" id="128" class="l">128: </a>    
<a href="#129" id="129" class="l">129: </a>    <span class="php-comment">//INCLUDE_EXT:</span>
<a href="#130" id="130" class="l">130: </a>    <span class="php-comment">//非AUTOLOAD严格模式下，可以在找不到目标类时，导入ext目录内全部文件来补救。（其实这么处理会有一定风险，因为在ext目录可能存在同名的类，且类中存在与欲访问的方法同名的方法，这样就导致了ext目录中某类方法的逻辑覆盖了预想的逻辑）</span>
<a href="#131" id="131" class="l">131: </a>    <span class="php-comment">// ! class_exists($class_name, false) &amp;&amp; false===DI_CLASS_AUTOLOAD_STRICT || DIInclude::includeAllPHP( DI_EXT_PATH );//包含ext目录中所有文件（其实这么处理会有一定风险，因为在ext目录可能存在同名的类，且类中存在与欲访问的方法同名的方法，这样就导致了ext目录中某类方法的逻辑覆盖了预想的逻辑）</span>
<a href="#132" id="132" class="l">132: </a>    ! <span class="php-keyword2">class_exists</span>(<span class="php-var">$class_name</span>, <span class="php-keyword1">false</span>) &amp;&amp; ! DI_CLASS_AUTOLOAD_STRICT &amp;&amp; DIInclude::includeAllPHP( DI_EXT_PATH );
<a href="#133" id="133" class="l">133: </a>    
<a href="#134" id="134" class="l">134: </a>    <span class="php-comment">//如果已经包含了ext目录中所有文件，但还是没找到该类，则利用DIException有选择地抛异常</span>
<a href="#135" id="135" class="l">135: </a>    <span class="php-keyword1">if</span>(! <span class="php-keyword2">class_exists</span>(<span class="php-var">$class_name</span>, <span class="php-keyword1">false</span>) ){
<a href="#136" id="136" class="l">136: </a>        <span class="php-var">$msg</span> = <span class="php-quote">&quot;类[ </span><span class="php-var">$class_name</span><span class="php-quote"> ]不存在&quot;</span>;
<a href="#137" id="137" class="l">137: </a>        <span class="php-keyword1">throw</span> <span class="php-keyword1">new</span> DIException(<span class="php-var">$msg</span>);
<a href="#138" id="138" class="l">138: </a>    }
<a href="#139" id="139" class="l">139: </a>}
<a href="#140" id="140" class="l">140: </a><span class="php-comment">// 强制注册__autoload，防止无法加载</span>
<a href="#141" id="141" class="l">141: </a><span class="php-keyword2">spl_autoload_register</span>(<span class="php-quote">'__autoload'</span>);
<a href="#142" id="142" class="l">142: </a>
<a href="#143" id="143" class="l">143: </a>
<a href="#144" id="144" class="l">144: </a><span class="php-comment">/**
</span><a href="#145" id="145" class="l">145: </a><span class="php-comment"> * TODO
</span><a href="#146" id="146" class="l">146: </a><span class="php-comment"> * 仿照java的import，导入ext目录的php文件。
</span><a href="#147" id="147" class="l">147: </a><span class="php-comment"> * 将按照递归顺序，从最深目录开始包含
</span><a href="#148" id="148" class="l">148: </a><span class="php-comment"> * 当包含的是单个文件时，还可以获得require语句的返回值，视所包含文件的return语句而定。
</span><a href="#149" id="149" class="l">149: </a><span class="php-comment"> * @param string $path 基于$inc的相对路径
</span><a href="#150" id="150" class="l">150: </a><span class="php-comment"> * @param string $inc 被作为参照的基路径，建议结尾要有“/”
</span><a href="#151" id="151" class="l">151: </a><span class="php-comment"> * @return mixed
</span><a href="#152" id="152" class="l">152: </a><span class="php-comment"> * &lt;pre&gt;
</span><a href="#153" id="153" class="l">153: </a><span class="php-comment"> *      如a/b/c对应/core/ext/a/b/c.php
</span><a href="#154" id="154" class="l">154: </a><span class="php-comment"> *        a/b/*对应/core/ext/a/b/目录下所有层次目录的文件
</span><a href="#155" id="155" class="l">155: </a><span class="php-comment"> *        “a/b/*”会自动转换为“a/b/”
</span><a href="#156" id="156" class="l">156: </a><span class="php-comment"> *        “*” 对应 /core/ext/目录下所有层次目录的文件
</span><a href="#157" id="157" class="l">157: </a><span class="php-comment"> *        “*” 可以转换为 “/”
</span><a href="#158" id="158" class="l">158: </a><span class="php-comment"> *        import(1)对应core/ext/1.php
</span><a href="#159" id="159" class="l">159: </a><span class="php-comment"> * &lt;/pre&gt;
</span><a href="#160" id="160" class="l">160: </a><span class="php-comment"> */</span>
<a href="#161" id="161" class="l">161: </a><span class="php-keyword1">function</span> import(<span class="php-var">$path</span> = <span class="php-quote">'*'</span>, <span class="php-var">$inc</span>=DI_EXT_PATH){
<a href="#162" id="162" class="l">162: </a>    <span class="php-var">$path</span> = <span class="php-keyword2">strval</span>(<span class="php-var">$path</span>); <span class="php-var">$inc</span> = <span class="php-keyword2">strval</span>(<span class="php-var">$inc</span>);
<a href="#163" id="163" class="l">163: </a>    <span class="php-keyword1">empty</span>(<span class="php-var">$path</span>) &amp;&amp; <span class="php-var">$path</span>=<span class="php-quote">'/'</span>;
<a href="#164" id="164" class="l">164: </a>    (<span class="php-keyword2">strlen</span>(<span class="php-var">$inc</span>)-<span class="php-num">1</span> === <span class="php-keyword2">strrpos</span>(<span class="php-var">$inc</span>, <span class="php-quote">'/'</span>)) || <span class="php-var">$inc</span>.=<span class="php-quote">'/'</span>;
<a href="#165" id="165" class="l">165: </a>    
<a href="#166" id="166" class="l">166: </a>    <span class="php-keyword1">if</span>(<span class="php-quote">'*'</span> != <span class="php-var">$path</span>){
<a href="#167" id="167" class="l">167: </a>        <span class="php-var">$path</span> = <span class="php-keyword2">trim</span>(<span class="php-var">$path</span>, <span class="php-quote">'*'</span>);
<a href="#168" id="168" class="l">168: </a>        <span class="php-var">$len</span> = <span class="php-keyword2">strlen</span>(<span class="php-var">$path</span>);
<a href="#169" id="169" class="l">169: </a>        <span class="php-var">$path</span> .= ( <span class="php-keyword2">substr</span>(<span class="php-var">$path</span>, <span class="php-var">$len</span>-<span class="php-num">1</span>) == <span class="php-quote">'/'</span> ) ? <span class="php-quote">''</span> : <span class="php-quote">'.php'</span>;
<a href="#170" id="170" class="l">170: </a>        <span class="php-var">$inc</span> .= <span class="php-var">$path</span>;
<a href="#171" id="171" class="l">171: </a>    }
<a href="#172" id="172" class="l">172: </a>    
<a href="#173" id="173" class="l">173: </a>    <span class="php-comment">//如果从Runtime中发现已有导入，则不再导入。这里可以阻止已导入的文件夹和文件之间的冲突</span>
<a href="#174" id="174" class="l">174: </a>    <span class="php-keyword1">if</span> (!DIRuntime_Imported::push(<span class="php-var">$inc</span>)) {
<a href="#175" id="175" class="l">175: </a>        <span class="php-keyword1">return</span> <span class="php-keyword1">false</span>;
<a href="#176" id="176" class="l">176: </a>    }
<a href="#177" id="177" class="l">177: </a>
<a href="#178" id="178" class="l">178: </a>    <span class="php-keyword1">if</span>(<span class="php-keyword2">is_file</span>(<span class="php-var">$inc</span>)){
<a href="#179" id="179" class="l">179: </a>        <span class="php-keyword1">return</span> <span class="php-keyword1">require_once</span> <span class="php-var">$inc</span>;
<a href="#180" id="180" class="l">180: </a>    }<span class="php-keyword1">else</span> <span class="php-keyword1">if</span>(<span class="php-keyword2">is_dir</span>(<span class="php-var">$inc</span>)){
<a href="#181" id="181" class="l">181: </a>        DIInclude::includeAllPHP(<span class="php-var">$inc</span>);
<a href="#182" id="182" class="l">182: </a>    }<span class="php-keyword1">else</span>{
<a href="#183" id="183" class="l">183: </a>        <span class="php-var">$d</span> = <span class="php-keyword2">debug_backtrace</span>();
<a href="#184" id="184" class="l">184: </a>        <span class="php-var">$msg</span> = <span class="php-quote">&quot;import()操作错误：文件或目录[ </span><span class="php-var">$inc</span><span class="php-quote"> ]不存在&lt;br&gt;错误源：</span><span class="php-var">{$d[0]['file']}</span><span class="php-quote">::第</span><span class="php-var">{$d[0]['line']}</span><span class="php-quote">行import()处&lt;br&gt;&quot;</span>;
<a href="#185" id="185" class="l">185: </a>        <span class="php-keyword1">throw</span> <span class="php-keyword1">new</span> DIException(<span class="php-var">$msg</span>);
<a href="#186" id="186" class="l">186: </a>    }
<a href="#187" id="187" class="l">187: </a>}
<a href="#188" id="188" class="l">188: </a>
<a href="#189" id="189" class="l">189: </a><span class="php-comment">/** 
</span><a href="#190" id="190" class="l">190: </a><span class="php-comment"> * 检测组件的支持文件是否存在
</span><a href="#191" id="191" class="l">191: </a><span class="php-comment"> * 支持的组件有：
</span><a href="#192" id="192" class="l">192: </a><span class="php-comment"> *      DO/MODEL/FILTER/INJECT/SERVICE
</span><a href="#193" id="193" class="l">193: </a><span class="php-comment"> *      ENTITY
</span><a href="#194" id="194" class="l">194: </a><span class="php-comment"> * @param string $name 
</span><a href="#195" id="195" class="l">195: </a><span class="php-comment"> *      组件全名称，即类名，如TestInject，TestDo，注意大小写
</span><a href="#196" id="196" class="l">196: </a><span class="php-comment"> *      对于如Entity类型的组件，是没有前后缀的。
</span><a href="#197" id="197" class="l">197: </a><span class="php-comment"> * @return bool
</span><a href="#198" id="198" class="l">198: </a><span class="php-comment"> *      true    存在
</span><a href="#199" id="199" class="l">199: </a><span class="php-comment"> *      false   组件不支持或文件不存在
</span><a href="#200" id="200" class="l">200: </a><span class="php-comment"> */</span>
<a href="#201" id="201" class="l">201: </a><span class="php-keyword1">function</span> component_exist(<span class="php-var">$name</span>){
<a href="#202" id="202" class="l">202: </a>    <span class="php-var">$aap1</span> = DIIncludeConfig::DI_SPCL_AUTOLOAD_PATH();
<a href="#203" id="203" class="l">203: </a>    <span class="php-var">$aap2</span> = DIIncludeConfig::DI_NOSPCL_AUTOLOAD_PATH();
<a href="#204" id="204" class="l">204: </a>    <span class="php-var">$aap</span> = <span class="php-var">$aap1</span> + <span class="php-var">$aap2</span>;
<a href="#205" id="205" class="l">205: </a>    <span class="php-keyword1">foreach</span> (<span class="php-var">$aap</span> <span class="php-keyword1">as</span> <span class="php-var">$i</span>=&gt;<span class="php-var">$p</span>){
<a href="#206" id="206" class="l">206: </a>        <span class="php-keyword1">if</span> (@<span class="php-var">$rpos</span> = <span class="php-keyword2">strripos</span>(<span class="php-var">$name</span>, <span class="php-var">$i</span>)) {
<a href="#207" id="207" class="l">207: </a>            <span class="php-var">$name</span> = <span class="php-keyword2">substr</span>(<span class="php-var">$name</span>, <span class="php-num">0</span>, <span class="php-var">$rpos</span>);<span class="php-comment">//去除后缀(如果有)</span>
<a href="#208" id="208" class="l">208: </a>            <span class="php-var">$path</span> = <span class="php-keyword2">str_replace</span>(<span class="php-quote">'{name}'</span>, <span class="php-var">$name</span>, <span class="php-var">$p</span>);
<a href="#209" id="209" class="l">209: </a>            <span class="php-keyword1">if</span>(<span class="php-keyword2">file_exists</span>(<span class="php-var">$path</span>)) <span class="php-keyword1">return</span> <span class="php-keyword1">true</span>;
<a href="#210" id="210" class="l">210: </a>        }
<a href="#211" id="211" class="l">211: </a>    }
<a href="#212" id="212" class="l">212: </a>    <span class="php-keyword1">return</span> <span class="php-keyword1">false</span>;
<a href="#213" id="213" class="l">213: </a>}
<a href="#214" id="214" class="l">214: </a>
<a href="#215" id="215" class="l">215: </a><span class="php-comment">/**
</span><a href="#216" id="216" class="l">216: </a><span class="php-comment"> * 调用对象的方法
</span><a href="#217" id="217" class="l">217: </a><span class="php-comment"> * @param object $obj 对象句柄
</span><a href="#218" id="218" class="l">218: </a><span class="php-comment"> * @param string $method 方法名
</span><a href="#219" id="219" class="l">219: </a><span class="php-comment"> * @param array $args 参数数组
</span><a href="#220" id="220" class="l">220: </a><span class="php-comment"> */</span>
<a href="#221" id="221" class="l">221: </a><span class="php-keyword1">function</span> invoke_method(<span class="php-var">$obj</span>, <span class="php-var">$method</span>, <span class="php-var">$args</span>=<span class="php-keyword1">array</span>()){
<a href="#222" id="222" class="l">222: </a>    <span class="php-keyword1">if</span>(! <span class="php-keyword2">is_object</span>(<span class="php-var">$obj</span>)){
<a href="#223" id="223" class="l">223: </a>        <span class="php-keyword1">throw</span> <span class="php-keyword1">new</span> DIException(<span class="php-quote">&quot;</span><span class="php-var">{$obj}</span><span class="php-quote">对象不存在或非对象类型&quot;</span>);
<a href="#224" id="224" class="l">224: </a>    }
<a href="#225" id="225" class="l">225: </a>    <span class="php-keyword1">if</span>( <span class="php-keyword2">method_exists</span>(<span class="php-var">$obj</span>, <span class="php-var">$method</span>) ){
<a href="#226" id="226" class="l">226: </a>        <span class="php-keyword1">return</span> <span class="php-keyword2">call_user_func_array</span>(<span class="php-keyword1">array</span>(<span class="php-var">$obj</span>, <span class="php-var">$method</span>), <span class="php-var">$args</span>);
<a href="#227" id="227" class="l">227: </a>    }
<a href="#228" id="228" class="l">228: </a>    <span class="php-keyword1">else</span> <span class="php-keyword1">if</span>(<span class="php-keyword2">array_key_exists</span>(<span class="php-var">$method</span>, <span class="php-keyword2">get_object_vars</span>(<span class="php-var">$obj</span>))){
<a href="#229" id="229" class="l">229: </a>        <span class="php-keyword1">if</span>(<span class="php-keyword2">is_callable</span>(<span class="php-keyword1">array</span>(<span class="php-var">$obj</span>, <span class="php-var">$method</span>))){
<a href="#230" id="230" class="l">230: </a>            <span class="php-keyword2">call_user_func_array</span>(<span class="php-keyword1">array</span>(<span class="php-var">$obj</span>, <span class="php-var">$method</span>), <span class="php-var">$args</span>);
<a href="#231" id="231" class="l">231: </a>        }<span class="php-keyword1">else</span>{
<a href="#232" id="232" class="l">232: </a>            <span class="php-keyword1">throw</span> <span class="php-keyword1">new</span> DIException(<span class="php-quote">'成员方法访问操作：'</span> . <span class="php-keyword2">get_class</span>(<span class="php-var">$obj</span>) . <span class="php-quote">' -&gt; '</span> . <span class="php-var">$method</span> . <span class="php-quote">'成员变量不具备callable特性，不能调用&lt;br&gt;'</span>);
<a href="#233" id="233" class="l">233: </a>        }
<a href="#234" id="234" class="l">234: </a>    }
<a href="#235" id="235" class="l">235: </a>    <span class="php-keyword1">else</span>{
<a href="#236" id="236" class="l">236: </a>        <span class="php-comment">//如果成员不存在</span>
<a href="#237" id="237" class="l">237: </a>        <span class="php-keyword1">throw</span> <span class="php-keyword1">new</span> DIException(<span class="php-keyword2">get_class</span>(<span class="php-var">$obj</span>) . <span class="php-quote">&quot;对象的方法名[ </span><span class="php-var">{$method}</span><span class="php-quote"> ]不存在&quot;</span>);
<a href="#238" id="238" class="l">238: </a>    }
<a href="#239" id="239" class="l">239: </a>}
<a href="#240" id="240" class="l">240: </a>
<a href="#241" id="241" class="l">241: </a><span class="php-keyword1">function</span> invoke_func(<span class="php-var">$func</span>, <span class="php-var">$args</span>=<span class="php-keyword1">array</span>()){
<a href="#242" id="242" class="l">242: </a>    <span class="php-keyword2">call_user_func_array</span>(<span class="php-var">$func</span>, <span class="php-var">$args</span>);
<a href="#243" id="243" class="l">243: </a>}
<a href="#244" id="244" class="l">244: </a>
<a href="#245" id="245" class="l">245: </a><span class="php-comment">/**
</span><a href="#246" id="246" class="l">246: </a><span class="php-comment"> * 解决call_user_func_array()和new ReflectionMethod($obj, $method)
</span><a href="#247" id="247" class="l">247: </a><span class="php-comment"> * 参数调用错误的问题。
</span><a href="#248" id="248" class="l">248: </a><span class="php-comment"> * 使用：将需要传入的数组$arr用该方法包裹即可，如ref_arr($arr)
</span><a href="#249" id="249" class="l">249: </a><span class="php-comment"> */</span>
<a href="#250" id="250" class="l">250: </a><span class="php-keyword1">function</span> ref_arr(<span class="php-var">$arr</span>){
<a href="#251" id="251" class="l">251: </a>    <span class="php-keyword1">if</span> (<span class="php-keyword2">version_compare</span>(PHP_VERSION, <span class="php-quote">'5.3.0'</span>) &gt;= <span class="php-num">0</span>) {
<a href="#252" id="252" class="l">252: </a>        <span class="php-var">$refs</span> = <span class="php-keyword1">array</span>();
<a href="#253" id="253" class="l">253: </a>        <span class="php-keyword1">foreach</span>(<span class="php-var">$arr</span> <span class="php-keyword1">as</span> <span class="php-var">$key</span> =&gt; <span class="php-var">$value</span>)
<a href="#254" id="254" class="l">254: </a>            <span class="php-var">$refs</span>[<span class="php-var">$key</span>] = &amp;<span class="php-var">$arr</span>[<span class="php-var">$key</span>];
<a href="#255" id="255" class="l">255: </a>        <span class="php-keyword1">return</span> <span class="php-var">$refs</span>;
<a href="#256" id="256" class="l">256: </a>    }
<a href="#257" id="257" class="l">257: </a>    <span class="php-keyword1">return</span> <span class="php-var">$arr</span>;
<a href="#258" id="258" class="l">258: </a>}
<a href="#259" id="259" class="l">259: </a>
<a href="#260" id="260" class="l">260: </a><span class="php-comment">//删除数组某一项</span>
<a href="#261" id="261" class="l">261: </a><span class="php-keyword1">function</span> array_unset(&amp;<span class="php-var">$array</span>, <span class="php-var">$key</span>) {
<a href="#262" id="262" class="l">262: </a>    <span class="php-var">$value</span> = <span class="php-var">$array</span>[<span class="php-var">$key</span>];
<a href="#263" id="263" class="l">263: </a>    <span class="php-keyword1">unset</span>(<span class="php-var">$array</span>[<span class="php-var">$key</span>]);
<a href="#264" id="264" class="l">264: </a>    <span class="php-keyword1">return</span> <span class="php-var">$value</span>;
<a href="#265" id="265" class="l">265: </a>}
<a href="#266" id="266" class="l">266: </a>
<a href="#267" id="267" class="l">267: </a><span class="php-comment">/**
</span><a href="#268" id="268" class="l">268: </a><span class="php-comment"> * 函数的参数表转为字符串化
</span><a href="#269" id="269" class="l">269: </a><span class="php-comment"> * @param int $num 参数个数
</span><a href="#270" id="270" class="l">270: </a><span class="php-comment"> */</span>
<a href="#271" id="271" class="l">271: </a><span class="php-keyword1">function</span> params_to_str( <span class="php-var">$num</span> ){
<a href="#272" id="272" class="l">272: </a>    <span class="php-var">$params</span> = <span class="php-quote">''</span>;
<a href="#273" id="273" class="l">273: </a>    <span class="php-keyword1">for</span> (<span class="php-var">$i</span>=<span class="php-num">0</span>;<span class="php-var">$i</span>&lt;<span class="php-var">$num</span>;<span class="php-var">$i</span>++) <span class="php-var">$params</span> .= <span class="php-quote">'$param'</span>.<span class="php-var">$i</span>.<span class="php-quote">','</span>;
<a href="#274" id="274" class="l">274: </a>    <span class="php-var">$params</span> = <span class="php-keyword2">rtrim</span>(<span class="php-var">$params</span>, <span class="php-quote">','</span>);
<a href="#275" id="275" class="l">275: </a>    <span class="php-keyword1">return</span> <span class="php-var">$params</span>;
<a href="#276" id="276" class="l">276: </a>}
<a href="#277" id="277" class="l">277: </a>
<a href="#278" id="278" class="l">278: </a><span class="php-comment">/**
</span><a href="#279" id="279" class="l">279: </a><span class="php-comment"> * 创建一个类
</span><a href="#280" id="280" class="l">280: </a><span class="php-comment"> * @param string $name
</span><a href="#281" id="281" class="l">281: </a><span class="php-comment"> * @param bool $abstract
</span><a href="#282" id="282" class="l">282: </a><span class="php-comment"> * @param string $extends
</span><a href="#283" id="283" class="l">283: </a><span class="php-comment"> * @param string $implements
</span><a href="#284" id="284" class="l">284: </a><span class="php-comment"> * @param array $vars
</span><a href="#285" id="285" class="l">285: </a><span class="php-comment"> * @param array $funcs
</span><a href="#286" id="286" class="l">286: </a><span class="php-comment"> * @return DITempObject 如果需要，可使用这个返回的对象来创建临时对象
</span><a href="#287" id="287" class="l">287: </a><span class="php-comment"> * @example
</span><a href="#288" id="288" class="l">288: </a><span class="php-comment"> * &lt;pre&gt;
</span><a href="#289" id="289" class="l">289: </a><span class="php-comment"> * create_class(
</span><a href="#290" id="290" class="l">290: </a><span class="php-comment"> *      'Nima', true, 'DIBase', 'DIEventListener,DIEvent_CallFuncListener', 
</span><a href="#291" id="291" class="l">291: </a><span class="php-comment"> *      array(
</span><a href="#292" id="292" class="l">292: </a><span class="php-comment"> *          'private $var1;',
</span><a href="#293" id="293" class="l">293: </a><span class="php-comment"> *          'public $var2 = &quot;2&quot;;'
</span><a href="#294" id="294" class="l">294: </a><span class="php-comment"> *      ),
</span><a href="#295" id="295" class="l">295: </a><span class="php-comment"> *      array(
</span><a href="#296" id="296" class="l">296: </a><span class="php-comment"> *          'function __construct($var1){$this-&gt;var1=$var1;}',
</span><a href="#297" id="297" class="l">297: </a><span class="php-comment"> *          'public function func1(){echo &quot;this is func1()&quot;;}',
</span><a href="#298" id="298" class="l">298: </a><span class="php-comment"> *          'protected function _func2(){echo &quot;this is _fun2()&quot;;}'
</span><a href="#299" id="299" class="l">299: </a><span class="php-comment"> *      )
</span><a href="#300" id="300" class="l">300: </a><span class="php-comment"> * );
</span><a href="#301" id="301" class="l">301: </a><span class="php-comment"> * &lt;/pre&gt;
</span><a href="#302" id="302" class="l">302: </a><span class="php-comment"> */</span>
<a href="#303" id="303" class="l">303: </a><span class="php-keyword1">function</span> create_class(<span class="php-var">$name</span>, <span class="php-var">$abstract</span>=<span class="php-keyword1">false</span>, <span class="php-var">$extends</span>=<span class="php-keyword1">null</span>, <span class="php-var">$implements</span>=<span class="php-keyword1">null</span>, <span class="php-var">$vars</span>=<span class="php-keyword1">array</span>(), <span class="php-var">$funcs</span>=<span class="php-keyword1">array</span>()){
<a href="#304" id="304" class="l">304: </a>    <span class="php-var">$abstract</span> = <span class="php-var">$abstract</span>===<span class="php-keyword1">true</span> ? <span class="php-quote">'abstract'</span> : <span class="php-quote">''</span>;
<a href="#305" id="305" class="l">305: </a>    <span class="php-var">$code</span> = <span class="php-quote">&quot;</span><span class="php-var">$abstract</span><span class="php-quote"> class </span><span class="php-var">$name</span><span class="php-quote"> &quot;</span>;
<a href="#306" id="306" class="l">306: </a>    <span class="php-keyword1">empty</span>(<span class="php-var">$extends</span>) || <span class="php-var">$code</span> .= <span class="php-quote">&quot;extends </span><span class="php-var">$extends</span><span class="php-quote"> &quot;</span>;
<a href="#307" id="307" class="l">307: </a>    <span class="php-keyword1">empty</span>(<span class="php-var">$implements</span>) || <span class="php-var">$code</span> .= <span class="php-quote">&quot;implements </span><span class="php-var">$implements</span><span class="php-quote"> &quot;</span>;
<a href="#308" id="308" class="l">308: </a>    <span class="php-var">$code</span> .= <span class="php-quote">'{'</span>;
<a href="#309" id="309" class="l">309: </a>    <span class="php-keyword1">foreach</span> (<span class="php-keyword1">array</span>(<span class="php-quote">'vars'</span>,<span class="php-quote">'funcs'</span>) <span class="php-keyword1">as</span> <span class="php-var">$v</span>){
<a href="#310" id="310" class="l">310: </a>        <span class="php-var">$$v</span> = <span class="php-var">$$v</span> === <span class="php-keyword1">null</span> || ! <span class="php-keyword2">is_array</span>(<span class="php-var">$$v</span>) ? <span class="php-keyword1">array</span>() : <span class="php-var">$$v</span>;
<a href="#311" id="311" class="l">311: </a>        <span class="php-keyword1">foreach</span> (<span class="php-var">$$v</span> <span class="php-keyword1">as</span> <span class="php-var">$item</span>){
<a href="#312" id="312" class="l">312: </a>            <span class="php-var">$code</span> .= <span class="php-var">$item</span>;
<a href="#313" id="313" class="l">313: </a>        }
<a href="#314" id="314" class="l">314: </a>    }
<a href="#315" id="315" class="l">315: </a>    <span class="php-var">$code</span> .= <span class="php-quote">'}'</span>;
<a href="#316" id="316" class="l">316: </a>    <span class="php-comment">//file_put_contents(DI_DATA_PATH . 'cache/a.php', '&lt;?php  '.$code);//调试用，只注释不删除！</span>
<a href="#317" id="317" class="l">317: </a>    <span class="php-keyword2">eval</span>(<span class="php-var">$code</span>);
<a href="#318" id="318" class="l">318: </a>    
<a href="#319" id="319" class="l">319: </a>    <span class="php-comment">//创建类之后，可选择性的实例化一个临时对象。如create_class('clazz')-&gt;newInstance(array(参数集));</span>
<a href="#320" id="320" class="l">320: </a>    <span class="php-keyword1">if</span>(!<span class="php-keyword2">class_exists</span>(<span class="php-quote">'DITempObject'</span>, <span class="php-keyword1">false</span>)){
<a href="#321" id="321" class="l">321: </a>        <span class="php-keyword1">class</span> DITempObject <span class="php-keyword1">extends</span> DIBase {
<a href="#322" id="322" class="l">322: </a>            <span class="php-keyword1">var</span> <span class="php-var">$class_name</span>;
<a href="#323" id="323" class="l">323: </a>            <span class="php-keyword1">function</span> __construct(<span class="php-var">$class_name</span>){<span class="php-var">$this</span>-&gt;class_name = <span class="php-var">$class_name</span>;}
<a href="#324" id="324" class="l">324: </a>            <span class="php-keyword1">function</span> newInstance(<span class="php-var">$param_arr</span> = <span class="php-keyword1">array</span>()){ <span class="php-comment">//如果要传参给构造，则创建class时必须继承  {已经显示声明空参构造器的类}</span>
<a href="#325" id="325" class="l">325: </a>                <span class="php-var">$clazz</span> = <span class="php-var">$this</span>-&gt;class_name;
<a href="#326" id="326" class="l">326: </a>                <span class="php-var">$rc</span> = <span class="php-keyword1">new</span> ReflectionClass(<span class="php-var">$clazz</span>);
<a href="#327" id="327" class="l">327: </a>                <span class="php-keyword1">return</span> <span class="php-var">$rc</span>-&gt;newInstanceArgs(<span class="php-var">$param_arr</span>);
<a href="#328" id="328" class="l">328: </a>            }
<a href="#329" id="329" class="l">329: </a>        }
<a href="#330" id="330" class="l">330: </a>    }
<a href="#331" id="331" class="l">331: </a>    <span class="php-keyword1">return</span> <span class="php-keyword1">new</span> DITempObject(<span class="php-var">$name</span>);
<a href="#332" id="332" class="l">332: </a>}
<a href="#333" id="333" class="l">333: </a>
<a href="#334" id="334" class="l">334: </a>
<a href="#335" id="335" class="l">335: </a><span class="php-comment">/**
</span><a href="#336" id="336" class="l">336: </a><span class="php-comment"> * 取本应用的会话或设置会话
</span><a href="#337" id="337" class="l">337: </a><span class="php-comment"> * session($name)取会话；session($name, $value)设置会话；session()取所有会话。
</span><a href="#338" id="338" class="l">338: </a><span class="php-comment"> * 按名称存取会话时，将只会取出名称被指定前缀的会话。
</span><a href="#339" id="339" class="l">339: </a><span class="php-comment"> * @param string $name 会话名
</span><a href="#340" id="340" class="l">340: </a><span class="php-comment"> * @param string $value 设置值
</span><a href="#341" id="341" class="l">341: </a><span class="php-comment"> * @param string $prefix 会话名前缀，默认值详见DI_SESSION_PREFIX @ __lib.php
</span><a href="#342" id="342" class="l">342: </a><span class="php-comment"> * @param string $private 要取出所有会话的时候，是否只取出本应用私有的会话（即仅带前缀的会话）
</span><a href="#343" id="343" class="l">343: </a><span class="php-comment"> * @example
</span><a href="#344" id="344" class="l">344: </a><span class="php-comment"> *      session('abc')
</span><a href="#345" id="345" class="l">345: </a><span class="php-comment"> */</span>
<a href="#346" id="346" class="l">346: </a><span class="php-keyword1">function</span> session(<span class="php-var">$name</span>=<span class="php-keyword1">null</span>, <span class="php-var">$value</span>=<span class="php-keyword1">null</span>, <span class="php-var">$prefix</span>=<span class="php-keyword1">null</span>, <span class="php-var">$private</span>=<span class="php-keyword1">true</span>){
<a href="#347" id="347" class="l">347: </a>    <span class="php-var">$num</span> = <span class="php-keyword2">count</span>(<span class="php-keyword2">func_get_args</span>());
<a href="#348" id="348" class="l">348: </a>    <span class="php-var">$prefix</span> = <span class="php-keyword1">null</span>===<span class="php-var">$prefix</span> ? DI_SESSION_PREFIX : <span class="php-var">$prefix</span>;
<a href="#349" id="349" class="l">349: </a>    <span class="php-keyword1">if</span>(<span class="php-num">2</span> === <span class="php-var">$num</span>){
<a href="#350" id="350" class="l">350: </a>        <span class="php-var">$name</span> = <span class="php-keyword2">func_get_arg</span>(<span class="php-num">0</span>);
<a href="#351" id="351" class="l">351: </a>        <span class="php-var">$value</span> = <span class="php-keyword2">func_get_arg</span>(<span class="php-num">1</span>);
<a href="#352" id="352" class="l">352: </a>        <span class="php-var">$_SESSION</span>[<span class="php-var">$prefix</span>.<span class="php-var">$name</span>] = <span class="php-var">$value</span>;
<a href="#353" id="353" class="l">353: </a>    }
<a href="#354" id="354" class="l">354: </a>    <span class="php-keyword1">else</span> <span class="php-keyword1">if</span>(<span class="php-num">1</span> === <span class="php-var">$num</span>){
<a href="#355" id="355" class="l">355: </a>        <span class="php-var">$arg0</span> = <span class="php-keyword2">func_get_arg</span>(<span class="php-num">0</span>);
<a href="#356" id="356" class="l">356: </a>        <span class="php-keyword1">if</span> (<span class="php-keyword1">empty</span>(<span class="php-var">$arg0</span>) &amp;&amp; !<span class="php-keyword2">is_int</span>(<span class="php-var">$arg0</span>)) {
<a href="#357" id="357" class="l">357: </a>            <span class="php-keyword1">foreach</span> (<span class="php-var">$_SESSION</span> <span class="php-keyword1">as</span> <span class="php-var">$i</span>=&gt;<span class="php-var">$s</span>) {
<a href="#358" id="358" class="l">358: </a>                <span class="php-keyword1">if</span> (<span class="php-num">0</span> === <span class="php-keyword2">strpos</span>(<span class="php-var">$i</span>, DI_SESSION_PREFIX))
<a href="#359" id="359" class="l">359: </a>                    <span class="php-keyword1">unset</span>(<span class="php-var">$_SESSION</span>[<span class="php-var">$i</span>]);
<a href="#360" id="360" class="l">360: </a>            }
<a href="#361" id="361" class="l">361: </a>            <span class="php-keyword1">return</span>;<span class="php-comment">//如果第一个参数为null/false/空字符串,则清空所有DI前缀设置的会话</span>
<a href="#362" id="362" class="l">362: </a>        }
<a href="#363" id="363" class="l">363: </a>        <span class="php-keyword1">if</span>(!<span class="php-keyword1">isset</span>(<span class="php-var">$_SESSION</span>[<span class="php-var">$prefix</span>.<span class="php-var">$name</span>])){
<a href="#364" id="364" class="l">364: </a>            <span class="php-keyword1">throw</span> <span class="php-keyword1">new</span> DIException(<span class="php-quote">&quot;试图获取不存在的会话 [ </span><span class="php-var">{$prefix}{$name}</span><span class="php-quote"> ] &quot;</span>);
<a href="#365" id="365" class="l">365: </a>        }
<a href="#366" id="366" class="l">366: </a>        <span class="php-keyword1">return</span> <span class="php-var">$_SESSION</span>[<span class="php-var">$prefix</span>.<span class="php-var">$name</span>];
<a href="#367" id="367" class="l">367: </a>    }
<a href="#368" id="368" class="l">368: </a>    <span class="php-keyword1">else</span> <span class="php-keyword1">if</span>(<span class="php-num">0</span> === <span class="php-var">$num</span>){
<a href="#369" id="369" class="l">369: </a>        <span class="php-keyword1">if</span>(<span class="php-var">$private</span>){
<a href="#370" id="370" class="l">370: </a>            <span class="php-var">$zezzion</span> = <span class="php-keyword1">array</span>();
<a href="#371" id="371" class="l">371: </a>            <span class="php-keyword1">foreach</span> (<span class="php-var">$_SESSION</span> <span class="php-keyword1">as</span> <span class="php-var">$i</span>=&gt;<span class="php-var">$s</span>){
<a href="#372" id="372" class="l">372: </a>                <span class="php-keyword1">if</span>(<span class="php-num">0</span>===<span class="php-keyword2">strpos</span>(<span class="php-var">$i</span>, <span class="php-var">$prefix</span>) &amp;&amp; <span class="php-var">$i</span>!=<span class="php-var">$prefix</span>)
<a href="#373" id="373" class="l">373: </a>                    <span class="php-var">$zezzion</span>[<span class="php-var">$i</span>] = <span class="php-var">$s</span>;
<a href="#374" id="374" class="l">374: </a>            }
<a href="#375" id="375" class="l">375: </a>            <span class="php-keyword1">return</span> <span class="php-var">$zezzion</span>;
<a href="#376" id="376" class="l">376: </a>        }<span class="php-keyword1">else</span>{
<a href="#377" id="377" class="l">377: </a>            <span class="php-keyword1">return</span> <span class="php-var">$_SESSION</span>;
<a href="#378" id="378" class="l">378: </a>        }
<a href="#379" id="379" class="l">379: </a>    }
<a href="#380" id="380" class="l">380: </a>}
<a href="#381" id="381" class="l">381: </a>
<a href="#382" id="382" class="l">382: </a>
<a href="#383" id="383" class="l">383: </a><span class="php-comment">//会话是否存在</span>
<a href="#384" id="384" class="l">384: </a><span class="php-keyword1">function</span> session_exists(<span class="php-var">$key</span>, <span class="php-var">$prefix</span>=<span class="php-keyword1">null</span>){
<a href="#385" id="385" class="l">385: </a>    <span class="php-keyword1">empty</span>(<span class="php-var">$prefix</span>) &amp;&amp; !<span class="php-keyword2">is_numeric</span>(<span class="php-var">$prefix</span>) &amp;&amp; <span class="php-var">$prefix</span> = DI_SESSION_PREFIX;
<a href="#386" id="386" class="l">386: </a>    <span class="php-var">$fullkey</span> = <span class="php-var">$prefix</span> . <span class="php-var">$key</span>;
<a href="#387" id="387" class="l">387: </a>    <span class="php-keyword1">if</span> (<span class="php-keyword1">empty</span>(<span class="php-var">$fullkey</span>) &amp;&amp; !<span class="php-keyword2">is_numeric</span>(<span class="php-var">$fullkey</span>)) {
<a href="#388" id="388" class="l">388: </a>        <span class="php-keyword1">return</span> <span class="php-keyword1">false</span>;
<a href="#389" id="389" class="l">389: </a>    } <span class="php-keyword1">else</span> {
<a href="#390" id="390" class="l">390: </a>        <span class="php-keyword1">return</span> <span class="php-keyword1">isset</span>(<span class="php-var">$_SESSION</span>[<span class="php-var">$fullkey</span>]);
<a href="#391" id="391" class="l">391: </a>    }
<a href="#392" id="392" class="l">392: </a>}
<a href="#393" id="393" class="l">393: </a>
<a href="#394" id="394" class="l">394: </a>
<a href="#395" id="395" class="l">395: </a><span class="php-comment">/**
</span><a href="#396" id="396" class="l">396: </a><span class="php-comment"> * 删除某个key的会话(注意第二个参数是严格模式开关)
</span><a href="#397" id="397" class="l">397: </a><span class="php-comment"> * @param string $key 要删除的会话名（可能含前缀）
</span><a href="#398" id="398" class="l">398: </a><span class="php-comment"> * @param boolean $strict 如果指定为true，则在删除不存在的会话时抛出异常
</span><a href="#399" id="399" class="l">399: </a><span class="php-comment"> * @param string $prefix 会话名前缀
</span><a href="#400" id="400" class="l">400: </a><span class="php-comment"> * @throws DIException
</span><a href="#401" id="401" class="l">401: </a><span class="php-comment"> */</span>
<a href="#402" id="402" class="l">402: </a><span class="php-keyword1">function</span> session_remove(<span class="php-var">$key</span>, <span class="php-var">$strict</span> = <span class="php-keyword1">false</span>, <span class="php-var">$prefix</span> = <span class="php-keyword1">null</span>){
<a href="#403" id="403" class="l">403: </a>    <span class="php-var">$no_pre</span> = <span class="php-keyword1">empty</span>(<span class="php-var">$prefix</span>) &amp;&amp; !<span class="php-keyword2">is_numeric</span>(<span class="php-var">$prefix</span>);
<a href="#404" id="404" class="l">404: </a>    <span class="php-var">$no_pre</span> &amp;&amp; <span class="php-var">$prefix</span> = DI_SESSION_PREFIX;
<a href="#405" id="405" class="l">405: </a>    <span class="php-var">$fullkey</span> = <span class="php-var">$prefix</span> . <span class="php-var">$key</span>;
<a href="#406" id="406" class="l">406: </a>    <span class="php-var">$no_fullkey</span> = <span class="php-keyword1">empty</span>(<span class="php-var">$fullkey</span>) &amp;&amp; !<span class="php-keyword2">is_numeric</span>(<span class="php-var">$fullkey</span>);
<a href="#407" id="407" class="l">407: </a>    <span class="php-var">$no_dikey</span> = (!<span class="php-var">$no_pre</span> &amp;&amp; <span class="php-var">$fullkey</span> === <span class="php-var">$prefix</span>);<span class="php-comment">//session的key刚好等于前缀，且有显式设置前缀</span>
<a href="#408" id="408" class="l">408: </a>    
<a href="#409" id="409" class="l">409: </a>    <span class="php-keyword1">if</span> (!<span class="php-var">$no_fullkey</span> &amp;&amp; <span class="php-keyword1">isset</span>(<span class="php-var">$_SESSION</span>[<span class="php-var">$fullkey</span>])) {
<a href="#410" id="410" class="l">410: </a>        <span class="php-keyword1">if</span>(!<span class="php-var">$no_dikey</span>) <span class="php-keyword1">unset</span>(<span class="php-var">$_SESSION</span>[<span class="php-var">$fullkey</span>]);
<a href="#411" id="411" class="l">411: </a>    } <span class="php-keyword1">elseif</span> (<span class="php-var">$strict</span>) {
<a href="#412" id="412" class="l">412: </a>        <span class="php-keyword1">throw</span> <span class="php-keyword1">new</span> DIException(<span class="php-quote">&quot;会话</span><span class="php-var">{$fullkey}</span><span class="php-quote">不存在，不需要删除&quot;</span>);
<a href="#413" id="413" class="l">413: </a>    }
<a href="#414" id="414" class="l">414: </a>}
<a href="#415" id="415" class="l">415: </a>
<a href="#416" id="416" class="l">416: </a><span class="php-comment">//方便参数获取</span>
<a href="#417" id="417" class="l">417: </a><span class="php-var">$GLOBALS</span>[<span class="php-quote">'request_args'</span>] = <span class="php-keyword2">array_merge</span>(<span class="php-var">$_GET</span>, <span class="php-var">$_POST</span>);
<a href="#418" id="418" class="l">418: </a><span class="php-keyword1">function</span> arg(<span class="php-var">$name</span> = <span class="php-keyword1">null</span>, <span class="php-var">$default</span> = <span class="php-keyword1">null</span>, <span class="php-var">$callback_funcname</span> = <span class="php-keyword1">null</span>) {
<a href="#419" id="419" class="l">419: </a>    <span class="php-keyword1">if</span>(<span class="php-var">$name</span>){
<a href="#420" id="420" class="l">420: </a>        <span class="php-keyword1">if</span>(!<span class="php-keyword1">isset</span>(<span class="php-var">$GLOBALS</span>[<span class="php-quote">'request_args'</span>][<span class="php-var">$name</span>]))<span class="php-keyword1">return</span> <span class="php-var">$default</span>;
<a href="#421" id="421" class="l">421: </a>        <span class="php-var">$arg</span> = <span class="php-var">$GLOBALS</span>[<span class="php-quote">'request_args'</span>][<span class="php-var">$name</span>];
<a href="#422" id="422" class="l">422: </a>    }<span class="php-keyword1">else</span>{
<a href="#423" id="423" class="l">423: </a>        <span class="php-var">$arg</span> = <span class="php-var">$GLOBALS</span>[<span class="php-quote">'request_args'</span>];
<a href="#424" id="424" class="l">424: </a>    }
<a href="#425" id="425" class="l">425: </a>    <span class="php-keyword1">if</span>(<span class="php-var">$callback_funcname</span>)<span class="php-keyword2">array_walk_recursive</span>(<span class="php-var">$arg</span>, <span class="php-var">$callback_funcname</span>);
<a href="#426" id="426" class="l">426: </a>    <span class="php-keyword1">return</span> <span class="php-var">$arg</span>;
<a href="#427" id="427" class="l">427: </a>}
<a href="#428" id="428" class="l">428: </a>
<a href="#429" id="429" class="l">429: </a>
<a href="#430" id="430" class="l">430: </a><span class="php-keyword1">function</span> dump(<span class="php-var">$var</span>, <span class="php-var">$exit</span> = <span class="php-keyword1">false</span>){
<a href="#431" id="431" class="l">431: </a>    <span class="php-var">$output</span> = <span class="php-keyword2">print_r</span>(<span class="php-var">$var</span>, <span class="php-keyword1">true</span>);
<a href="#432" id="432" class="l">432: </a>    <span class="php-comment">//if(!DI_DEBUG_MODE)return error_log(str_replace(&quot;\n&quot;, '', $output));//此行准备删除</span>
<a href="#433" id="433" class="l">433: </a>    <span class="php-var">$content</span> = <span class="php-quote">&quot;&lt;div align=left&gt;&lt;pre&gt;\n&quot;</span> .<span class="php-keyword2">htmlspecialchars</span>(<span class="php-var">$output</span>). <span class="php-quote">&quot;\n&lt;/pre&gt;&lt;/div&gt;\n&quot;</span>;
<a href="#434" id="434" class="l">434: </a>    <span class="php-keyword1">echo</span> <span class="php-quote">&quot;&lt;html&gt;&lt;head&gt;&lt;meta http-equiv=\&quot;Content-Type\&quot; content=\&quot;text/html; charset=utf-8\&quot;&gt;&quot;</span>;
<a href="#435" id="435" class="l">435: </a>    <span class="php-keyword1">echo</span> <span class="php-quote">&quot;&lt;/head&gt;&lt;body&gt;</span><span class="php-var">{$content}</span><span class="php-quote">&lt;/body&gt;&lt;/html&gt;&quot;</span>;
<a href="#436" id="436" class="l">436: </a>    <span class="php-keyword1">if</span>(<span class="php-var">$exit</span>) <span class="php-keyword1">exit</span>();
<a href="#437" id="437" class="l">437: </a>}
<a href="#438" id="438" class="l">438: </a>
<a href="#439" id="439" class="l">439: </a><span class="php-keyword1">function</span> putjson(<span class="php-var">$code</span>, <span class="php-var">$data</span> = <span class="php-keyword1">null</span>, <span class="php-var">$msg</span> = <span class="php-quote">''</span>){
<a href="#440" id="440" class="l">440: </a>    <span class="php-comment">//application/x-javascript和application/json会触发IE下载，暂时取消</span>
<a href="#441" id="441" class="l">441: </a>    <span class="php-keyword1">echo</span> <span class="php-keyword2">json_encode</span>(<span class="php-keyword2">compact</span>(<span class="php-quote">'code'</span>, <span class="php-quote">'data'</span>, <span class="php-quote">'msg'</span>));
<a href="#442" id="442" class="l">442: </a>    <span class="php-keyword1">exit</span>;
<a href="#443" id="443" class="l">443: </a>}
<a href="#444" id="444" class="l">444: </a>
<a href="#445" id="445" class="l">445: </a><span class="php-comment">//jsonp数据输出</span>
<a href="#446" id="446" class="l">446: </a><span class="php-keyword1">function</span> putjsonp(<span class="php-var">$code</span>, <span class="php-var">$data</span> = <span class="php-keyword1">null</span>, <span class="php-var">$msg</span> = <span class="php-quote">''</span>, <span class="php-var">$callback</span>=<span class="php-quote">'callback'</span>){
<a href="#447" id="447" class="l">447: </a>    <span class="php-keyword2">header</span>(<span class="php-quote">&quot;Content-Type: application/x-javascript; charset=UTF-8&quot;</span>);
<a href="#448" id="448" class="l">448: </a>    <span class="php-keyword1">if</span>( !<span class="php-keyword1">empty</span>(<span class="php-var">$_GET</span>[<span class="php-var">$callback</span>])){
<a href="#449" id="449" class="l">449: </a>        <span class="php-keyword1">echo</span> <span class="php-var">$_GET</span>[<span class="php-var">$callback</span>]. <span class="php-quote">'('</span>. <span class="php-keyword2">json_encode</span>(<span class="php-keyword2">compact</span>(<span class="php-quote">'code'</span>, <span class="php-quote">'data'</span>, <span class="php-quote">'msg'</span>)) . <span class="php-quote">')'</span>;
<a href="#450" id="450" class="l">450: </a>    }<span class="php-keyword1">else</span>{
<a href="#451" id="451" class="l">451: </a>        <span class="php-keyword1">echo</span> <span class="php-keyword2">json_encode</span>(<span class="php-keyword2">compact</span>(<span class="php-quote">'code'</span>, <span class="php-quote">'data'</span>, <span class="php-quote">'msg'</span>));
<a href="#452" id="452" class="l">452: </a>    }
<a href="#453" id="453" class="l">453: </a>    <span class="php-keyword1">exit</span>;
<a href="#454" id="454" class="l">454: </a>}
<a href="#455" id="455" class="l">455: </a>
<a href="#456" id="456" class="l">456: </a><span class="php-comment">/**
</span><a href="#457" id="457" class="l">457: </a><span class="php-comment"> * 首选跳转XxxDO::func()，否则视为/index.php的相对路径，找不到时输出404页
</span><a href="#458" id="458" class="l">458: </a><span class="php-comment"> * 也可以强制用第二个参数将shell指定为文件路径
</span><a href="#459" id="459" class="l">459: </a><span class="php-comment"> * @notice 
</span><a href="#460" id="460" class="l">460: </a><span class="php-comment"> *  依赖方法：component_exist()、invoke_method()
</span><a href="#461" id="461" class="l">461: </a><span class="php-comment"> *  依赖常量：DI_KEYWORD_DO、DI_PAGE_404
</span><a href="#462" id="462" class="l">462: </a><span class="php-comment"> * @author biao
</span><a href="#463" id="463" class="l">463: </a><span class="php-comment"> * @since 2014-12-16
</span><a href="#464" id="464" class="l">464: </a><span class="php-comment"> */</span>
<a href="#465" id="465" class="l">465: </a><span class="php-keyword1">function</span> redirect(<span class="php-var">$shell</span>, <span class="php-var">$params</span> = <span class="php-keyword1">array</span>()){
<a href="#466" id="466" class="l">466: </a>    <span class="php-comment">//如果第二参数设置为false，则将shell视为文件路径</span>
<a href="#467" id="467" class="l">467: </a>    <span class="php-keyword1">if</span> (<span class="php-keyword1">false</span> === <span class="php-var">$params</span>) {
<a href="#468" id="468" class="l">468: </a>        <span class="php-keyword1">require</span> <span class="php-var">$shell</span>;
<a href="#469" id="469" class="l">469: </a>        <span class="php-keyword1">exit</span>;
<a href="#470" id="470" class="l">470: </a>    }
<a href="#471" id="471" class="l">471: </a>    
<a href="#472" id="472" class="l">472: </a>    <span class="php-var">$ar</span> = <span class="php-keyword2">explode</span>(<span class="php-quote">'/'</span>, <span class="php-var">$shell</span>);
<a href="#473" id="473" class="l">473: </a>    <span class="php-var">$validate</span> = <span class="php-keyword2">is_string</span>(<span class="php-var">$shell</span>) &amp;&amp; !<span class="php-keyword1">empty</span>(<span class="php-var">$ar</span>) &amp;&amp; <span class="php-num">2</span> == <span class="php-keyword2">count</span>(<span class="php-var">$ar</span>);
<a href="#474" id="474" class="l">474: </a>    <span class="php-keyword1">if</span> (<span class="php-var">$validate</span>) {
<a href="#475" id="475" class="l">475: </a>        <span class="php-var">$do</span> = <span class="php-var">$ar</span>[<span class="php-num">0</span>] . DI_KEYWORD_DO;
<a href="#476" id="476" class="l">476: </a>        <span class="php-var">$func</span> = <span class="php-var">$ar</span>[<span class="php-num">1</span>];
<a href="#477" id="477" class="l">477: </a>        <span class="php-var">$d</span> = component_exist(<span class="php-var">$do</span>);
<a href="#478" id="478" class="l">478: </a>        <span class="php-var">$m</span> = <span class="php-keyword2">method_exists</span>(<span class="php-var">$do</span>, <span class="php-var">$func</span>);
<a href="#479" id="479" class="l">479: </a>        <span class="php-keyword1">if</span> (<span class="php-var">$d</span> &amp;&amp; <span class="php-var">$m</span>) {
<a href="#480" id="480" class="l">480: </a>            invoke_method(<span class="php-keyword1">new</span> <span class="php-var">$do</span>(), <span class="php-var">$func</span>, <span class="php-var">$params</span>);
<a href="#481" id="481" class="l">481: </a>            <span class="php-keyword1">exit</span>;
<a href="#482" id="482" class="l">482: </a>        }
<a href="#483" id="483" class="l">483: </a>    }
<a href="#484" id="484" class="l">484: </a>    
<a href="#485" id="485" class="l">485: </a>    <span class="php-keyword1">if</span> (<span class="php-keyword2">file_exists</span>(<span class="php-var">$shell</span>)) {
<a href="#486" id="486" class="l">486: </a>        <span class="php-keyword1">require</span> <span class="php-var">$shell</span>;
<a href="#487" id="487" class="l">487: </a>        <span class="php-keyword1">exit</span>;
<a href="#488" id="488" class="l">488: </a>    }
<a href="#489" id="489" class="l">489: </a>    
<a href="#490" id="490" class="l">490: </a>    <span class="php-keyword1">throw</span> <span class="php-keyword1">new</span> DIException(<span class="php-quote">&quot;shell参数[</span><span class="php-var">{$shell}</span><span class="php-quote">]不是一个有效的DO指令，也不是一个文件路径，无法跳转&quot;</span>);
<a href="#491" id="491" class="l">491: </a>}
<a href="#492" id="492" class="l">492: </a>
<a href="#493" id="493" class="l">493: </a><span class="php-comment">/**
</span><a href="#494" id="494" class="l">494: </a><span class="php-comment"> * 生成URL
</span><a href="#495" id="495" class="l">495: </a><span class="php-comment"> * @param string $shell “?”之后紧跟的URL指令，如“test-test”、“a.b”
</span><a href="#496" id="496" class="l">496: </a><span class="php-comment"> * @param array $params GET参数，键名必须符合变量命名规范
</span><a href="#497" id="497" class="l">497: </a><span class="php-comment"> * @return string
</span><a href="#498" id="498" class="l">498: </a><span class="php-comment"> */</span>
<a href="#499" id="499" class="l">499: </a><span class="php-keyword1">function</span> url(<span class="php-var">$shell</span>, <span class="php-keyword1">array</span> <span class="php-var">$params</span> = <span class="php-keyword1">array</span>()){
<a href="#500" id="500" class="l">500: </a>    <span class="php-var">$u</span> = <span class="php-quote">'?'</span> . <span class="php-var">$shell</span>;
<a href="#501" id="501" class="l">501: </a>    <span class="php-keyword1">foreach</span> (<span class="php-var">$params</span> <span class="php-keyword1">as</span> <span class="php-var">$k</span> =&gt; <span class="php-var">$v</span>) {
<a href="#502" id="502" class="l">502: </a>        <span class="php-keyword1">if</span> (!<span class="php-keyword2">is_numeric</span>(<span class="php-var">$k</span>) &amp;&amp; (<span class="php-keyword2">is_string</span>(<span class="php-var">$v</span>) || <span class="php-keyword2">is_numeric</span>(<span class="php-var">$v</span>)))
<a href="#503" id="503" class="l">503: </a>            <span class="php-var">$u</span> .= <span class="php-quote">&quot;&amp;</span><span class="php-var">{$k}</span><span class="php-quote">=</span><span class="php-var">{$v}</span><span class="php-quote">&quot;</span>;
<a href="#504" id="504" class="l">504: </a>    }
<a href="#505" id="505" class="l">505: </a>    <span class="php-keyword1">return</span> <span class="php-var">$u</span>;
<a href="#506" id="506" class="l">506: </a>}
<a href="#507" id="507" class="l">507: </a>
<a href="#508" id="508" class="l">508: </a><span class="php-comment">/**
</span><a href="#509" id="509" class="l">509: </a><span class="php-comment"> * 取得访问IP
</span><a href="#510" id="510" class="l">510: </a><span class="php-comment"> * @since 2014-12-29
</span><a href="#511" id="511" class="l">511: </a><span class="php-comment"> */</span>
<a href="#512" id="512" class="l">512: </a><span class="php-keyword1">function</span> getip(){
<a href="#513" id="513" class="l">513: </a>    <span class="php-keyword1">if</span> (!<span class="php-keyword1">empty</span>(<span class="php-var">$_SERVER</span>[<span class="php-quote">'HTTP_CLIENT_IP'</span>])){ <span class="php-comment">//check ip from share internet</span>
<a href="#514" id="514" class="l">514: </a>        <span class="php-var">$ip</span> = <span class="php-var">$_SERVER</span>[<span class="php-quote">'HTTP_CLIENT_IP'</span>];
<a href="#515" id="515" class="l">515: </a>    }<span class="php-keyword1">elseif</span>(!<span class="php-keyword1">empty</span>(<span class="php-var">$_SERVER</span>[<span class="php-quote">'HTTP_CDN_SRC_IP'</span>])){
<a href="#516" id="516" class="l">516: </a>        <span class="php-var">$ip</span> = <span class="php-var">$_SERVER</span>[<span class="php-quote">'HTTP_CDN_SRC_IP'</span>];
<a href="#517" id="517" class="l">517: </a>    }
<a href="#518" id="518" class="l">518: </a>    <span class="php-keyword1">elseif</span> (!<span class="php-keyword1">empty</span>(<span class="php-var">$_SERVER</span>[<span class="php-quote">'HTTP_X_FORWARDED_FOR'</span>])){  <span class="php-comment">//to check ip is pass from proxy</span>
<a href="#519" id="519" class="l">519: </a>        <span class="php-var">$ip</span> = <span class="php-var">$_SERVER</span>[<span class="php-quote">'HTTP_X_FORWARDED_FOR'</span>];
<a href="#520" id="520" class="l">520: </a>    }
<a href="#521" id="521" class="l">521: </a>    <span class="php-keyword1">else</span>{
<a href="#522" id="522" class="l">522: </a>        <span class="php-var">$ip</span> = <span class="php-var">$_SERVER</span>[<span class="php-quote">'REMOTE_ADDR'</span>];
<a href="#523" id="523" class="l">523: </a>    }
<a href="#524" id="524" class="l">524: </a>    <span class="php-keyword1">return</span> <span class="php-var">$ip</span>;
<a href="#525" id="525" class="l">525: </a>}
<a href="#526" id="526" class="l">526: </a></code></pre>

	<div id="footer">
		 API documentation generated by <a href="http://apigen.org">ApiGen 2.6.0</a>
	</div>
</div>
</div>
</body>
</html>
